🦊Wan2.1_VACE
🏠 | 🦊雑に学ぶComfyUI
👈 | 🦊Wan2.1
👉 |
ざっくり言えば動画生成におけるControlNet、in/outpainting、reference2video等の動画編集が一つでできるすごいやつです
LTX-Video版とWan2.1版がありますが、このページはWan2.1版
参考
https://github.com/ali-vilab/VACE/blob/main/UserGuide.mdVACE User Guide
https://docs.comfy.org/tutorials/video/wan/vaceComfyUI Wan2.1 VACE Video Examples
⚠️公式のWorkflowの動画保存ノードはパス指定とかすると何故か保存に失敗しがちなので保存時に日付とかで階層保存してる場合はComfyUI-VideoHelperSuiteのVideo Combineノード辺りで保存するほうが良いかもしれない。
モデルのダウンロード
https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/diffusion_models/wan2.1_vace_1.3B_preview_fp16.safetensorswan2.1_vace_1.3B_preview_fp16.safetensors
https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/diffusion_models/wan2.1_vace_1.3B_fp16.safetensorswan2.1_vace_1.3B_fp16.safetensors
https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/diffusion_models/wan2.1_vace_14B_fp16.safetensorswan2.1_vace_14B_fp16.safetensors
code:model
📂ComfyUI/
└── 📂models/
└── 📂diffusion_models/
└── wan2.1_vace_1.3B_fp16.safetensors
GGUF
https://huggingface.co/QuantStack/Wan2.1-VACE-14B-GGUF/tree/mainQuantStack/Wan2.1-VACE-14B-GGUF
code:model
📂ComfyUI/
└── 📂models/
└── 📂unet/
└── Wan2.1-VACE-14B.gguf
推奨設定値
解像度
1.3B : 480P
14B : 720P
32の倍数
フレーム数
最大81f (5秒 × 16fps)
🚨業務連絡
VACEとSkipLayerGuidanceの相性が悪そうなので、抜いてください
cf. VACE Extensionで動画を滑らかにループさせる#683a83ad000000000022db79
生成された動画がover-saturated colors気味だったのもこれだったか…nomadoor.icon
ControlNet(的な)
https://gyazo.com/ef1dae4f7c1fe82cb201e33558c6ca39
Wan2.1_VACE_control_pose.json
Wan2.1_VACE_control_pose_V2.json
🟩基本的な考え方は🦊ControlNetと同じで、ポーズや深度マップをpreprocessorで作ってWaVaceToVideoノードに渡します
ポーズ、深度マップ以外にもscribble、optical_flow、layoutを入力として使用可能
https://gyazo.com/a9d4dd5517455bd85cd700c387c28291https://gyazo.com/8719001c6976f5877eb237bd16df15f1
reference2video
https://gyazo.com/026bb65307ee96b243ccc2625e6d35a5
Wan2.1_VACE_reference.json
Wan2.1_VACE_reference_v2.json
Wan2.1_VACE_reference_V3.json
🟩参照画像をうまく転送するには背景を除去&白で埋める必要があります(今回はBiRefNet)
裏技的に画像周りを白のpaddingで囲むと転送できるというのもあるけど、そんなに上手く行かない
🟥生成動画の初期数フレームに、参照画像との重なりがあるのでTrimVideoLatentノードでその部分を捨てます
旧 : Split Imagesノードで捨てていたのを変更。latentの状態で捨てたほうがデコードする枚数が減るのでお得
https://gyazo.com/fc3cee85ff8b704a5167d755c7fb51behttps://gyazo.com/ecab1cc0bf40b1cfe1931645a6a219behttps://gyazo.com/d2f6da62385b3687a5603fcd0d4d8cd4
参照画像 / 生成動画 / 初期フレームカット
逆にくり抜かずに画像を渡すと概ねI2Vのようなことができたりします(SkyReels V2 DFと似たような挙動)
🚨このimgae2videoっぽいというのがちょっと大事で、refereceとして入力する画像のサイズ、位置に生成動画が少し引っ張られます
https://gyazo.com/b0806154fa8408fae52ea15ac05d1ec9https://gyazo.com/88e1a10df4fb53d9791a9cfbe741f66c
これは単純にミスしただけなのだけど、生成動画の設定を横長にしたのに、正方形のままreference画像を入力したので上下がクロップされました
その結果耳がちょん切れてしまい、生成された動画もドラえもんみたいな惨状になっています
複数のreference
https://gyazo.com/59d9e0ab34e25ae365fa6b63cc6d356e
Wan2.1_VACE_multi_reference.json
Wan2.1_VACE_multi_reference_v2.json
Wan2.1_VACE_multi_reference_V3.json
🟪14Bモデル(fp8)
referenceを使うときは1.3Bだとまともな動画が作れない気がするnomadoor.icon
🟩複数の参照画像を使いたいときは、単に横並べした画像を作り、それをreference_imageに入力します
🟨参照画像が一枚のときと同様、出力するときの解像度に合わせ、参照画像がクロップされてはみ出ないようにします
https://gyazo.com/2c745f54cc9d62bd97a85f6fd102fe27
空間的なinpainting
🚨control_videoに入力する動画のマスク部分を白で埋めていたけど、正しくははグレー(RGB:127,127,127)で埋めるべきでした cf. https://github.com/Decentralised-AI/VACE-All-in-One-Video-Creation-and-Editing/blob/main/UserGuide.md?utm_source=chatgpt.com#3-preprocessingVACE User Guide
どっちでもそんなに変わらないけどね…nomadoor.icon
https://gyazo.com/516fed114e2f9cd247eed1d9a3c82770
Wan2.1_VACE_inpainting.json
Wan2.1_VACE_inpainting_gray.json
Wan2.1_VACE_inpainting_V2.json
🟪14Bモデル
🟩Florence-2で車を検出、今回は適当なマスクで良いので、BBOXをそのままマスクとして使用
🟩WanVaceToVideoのcontrol_videoに入力する画像は、マスク部分を灰色で埋める必要があるため、ただの灰色画像を作りImageCompositeMaskedノードでマスク部分に重ねます
https://gyazo.com/cabe695d49f5f8cca4c1dfbe4bc8498chttps://gyazo.com/747858b1a359aef22a17eb06d07625b4https://gyazo.com/75c4eb2779be2373467eef6de9d5b330
空間的なoutpainting
https://gyazo.com/b3775e8e75ff61ae0d87dcd3b43028d1
Wan2.1_VACE_outpainting.json
Wan2.1_VACE_outpainting_V2.json
静止画でのoutpaintingと同様、追加したマスク部分を埋める様に動画生成します
🟩ImagePad KJノードでpaddingを追加された画像と、追加したマスクをWanVaceToVideoノードに接続します
🟩WanVaceToVideoノードに入れるときに解像度を32の倍数にしないといけないので注意
https://gyazo.com/29427b96c53a2fdac8c18d634287fda9https://gyazo.com/5414ecc07ec5ce04ac5fff74d5ab2ba2
時間的なoutpainting (Extension)
入力動画の最初のNフレームのみ使用し、続きを生成させます
もちろん、1フレームのみ使い続きを生成することもできます
https://gyazo.com/ee3739958e95c68676cd003cf7753ce1
Wan2.1_VACE_Extension.json
Wan2.1_VACE_Extension_V2.json
🟩ImageFromBatchノードによって、入力動画の最初の10フレームのみWanVaceToVideoに入力
🟩Create Fade Mask Advancedノードによって、11~最終フレームまで画面全部を覆うマスクを作成し入力
https://gyazo.com/b647967a0b425e706312b432023b4599https://gyazo.com/ec84d51f29f68d95e0743b061a46b993
入力 / 11フレーム以降はExtension(プロンプトに従って動画拡張)
WanVaceToVideoのcontrol_videoのややこしいと思ったところnomadoor.icon
通常inpaintingは、"完全な元画像"とマスクを渡すけれど、入力された動画自体が仮にポーズやDepthで無くても何かしらのガイドとしてVACEが使ってしまうため、マスクの部分を白で埋めるか、Depthやらなにやらで埋めないといけない
Extensionも同様に、使わない部分は消さないと余計なガイドとして働いてしまう
🤝組み合わせる
FaceSwap (ControlNet Depth + inpainting + reference)
https://gyazo.com/6e277ec8a8f460881c6a5fad8139a997
Wan2.1_VACE_control depth_inpainting_reference.json
Wan2.1_VACE_control depth_inpainting_reference_V2.json
🟩顔部分をSimple Detectorでマスク
🟩Depth Anything v2で深度マップ作成
上2つを合わせ、顔部分を深度マップに置き換えたものをcontrol_videoとして使用
🟦顔画像を切り抜きし背景を白で埋め、 control_videoと同じサイズになるようpadding
https://gyazo.com/1638fcf19f3e8c71d386709deac0267chttps://gyazo.com/a6a17f1fc166aef0a4a05018078834a1https://gyazo.com/54019604f8dc586b73d4e0b84fc4e35ehttps://gyazo.com/4f83fdcc9615e85248585f2936ec3fb6
元動画 / 顔部分を深度マップに置き換え / 参照画像 / 出力
レイアウトコントロール (Control Layout + Extension + reference)
https://gyazo.com/65b21058c47ff66052a8797bb412d25b
Wan2.1_VACE_control layout_Extension_reference.json
Wan2.1_VACE_control layout_Extension_reference_V2.json
🟨続きを作ってほしい画像1フレーム + レイアウトを指定するボックスアニメーションを合体させて一つの動画に
これをcontrol videoに入力
referenceとしても画像を入力
無くてもよいはずだけど、無いときよりキャラが安定した
🟩2フレーム目からをExtensionしてほしいので、2フレーム目以降を全面マスクで埋める
🟥referenceを使ったので初期重なり部分を削除
https://gyazo.com/f2679feede8fc08cd448e86ceed30ee9https://gyazo.com/d1d90dab2f79b662582d81845e6257fc
🟩ちなみにマスクが無くても問題なく動画の生成はできるけれど、入力した画像のディテールが失われてしまう
https://gyazo.com/51a0a8f21ecbeb3e8e324fdc1c8b653d
https://whatdreamscost.github.io/Spline-Path-Control/Spline-Path-Control
白黒のボックスアニメーションを作るのに特化したサイト
黒背景に白ボックスの方が良いらしいnomadoor.icon
中割り
→ VACE ExtensionとFLF2Vの違い#682b3d2c0000000000f83f22
https://gyazo.com/9cb508fbbc705b2719e6c66a813bf17e
Wan2.1_VACE_4imagesV2.json
つなぐ・ループ
→ VACE Extensionで動画を滑らかにループさせる
https://gyazo.com/d2b6874f4fea944fd8ddf8fd0d4ed5b9
https://openart.ai/workflows/nomadoor/loop-anything-with-wan21-vace/qz02Zb3yrF11GKYi6vduWan2.1_VACE_Extension_loop_V2.json
メモ書き
極論してしまうと、通常のWan2.1 T2Vとの違いは下記のWanVaceToVideoの存在。これ無しで生成するとほぼ通常のWan2.1 T2Vと同じ挙動をする。
https://gyazo.com/1db78f818f794051f6e00f163b2e6a06
多分このノードでControlや参照画像を潜在空間にモデルが理解できるように落とし込んでいる?
挙動を見る限り、考え方としてVACEはマスクに対していわゆる「グリーンバック合成」的な考え方に近そう(グリーンバックが緑を透明にするのに対してVACEはホワイトバックとでも言うべきマスクを生成して補完する)
普通にinpaintingのマスクと同じ様に、画面全体に合うようにマスクの部分だけ生成するよ~で良いと思うnomadoor.icon
https://note.com/198619891990/n/nd9716b8e66d3そういう用途で使う人は少ないとは思いますが、どうやら(少なくともComfyUIの実装では)1フレーム指定で画像を作ろうとしても4枚付け足して(計五枚に)しまうらしい…
🦊Wan2.1 画像生成#68743c5000000000002999ba
VACEでReference機能を使うときのみ最低5(4 +1)枚いるnomadoor.icon
#VACE